#pragma once
#include "grpc_client.h"
#include <map>
#include <queue>
#include <mutex>
#include <memory>
#include <string>

namespace cpp_backend {
namespace framework {

/**
 * @brief gRPC客户端连接池
 * 
 * 负责：
 * - 管理gRPC客户端连接
 * - 连接复用
 * - 自动创建和回收
 */
class GrpcClientPool {
public:
    GrpcClientPool(int max_clients_per_host = 10)
        : max_clients_per_host_(max_clients_per_host) {}
    
    ~GrpcClientPool() {
        clear();
    }
    
    /**
     * @brief 获取客户端（从池中取出或创建新的）
     * @param host 服务器地址
     * @param port 服务器端口
     * @return 客户端指针（需要调用return_client归还）
     */
    GrpcClient* get_client(const std::string& host, int port);
    
    /**
     * @brief 归还客户端到池中
     * @param client 客户端指针
     */
    void return_client(GrpcClient* client);
    
    /**
     * @brief 清空连接池
     */
    void clear();
    
private:
    int max_clients_per_host_;
    std::mutex pool_mutex_;
    
    // endpoint -> 客户端列表
    std::map<std::string, std::vector<std::unique_ptr<GrpcClient>>> clients_;
    
    // endpoint -> 空闲客户端队列
    std::map<std::string, std::queue<GrpcClient*>> idle_clients_;
    
    /**
     * @brief 生成endpoint字符串
     */
    std::string make_endpoint(const std::string& host, int port) const {
        return host + ":" + std::to_string(port);
    }
};

} // namespace framework
} // namespace cpp_backend
